/* 封装axios用于发请求 */
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
import JSONBig from 'json-bigint'
// 创建一个新的axios实例
const baseURL = 'http://toutiao-app.itheima.net'
// const baseURL = 'http://localhost:8000'
const request = axios.create({
  // 配置基础路径
  baseURL,
  // 设置超时时间
  timeout: 5000,
  // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    try {
      return JSONBig.parse(data)
    } catch {
      return data
    }
  }]
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  const token = store.state.user.token.token
  // console.log(config)
  if (token) {
    config.headers.Authorization = 'Bearer ' + token
  }
  return config
}, function (error) {
  return Promise.reject(error)
})
// 封装一下由于没有token跳转login的代码
function goLogin () {
  store.commit('user/removeToken')
  Toast.fail('登录信息过期')
  router.push({
    path: '/login',
    query: {
      back: router.currentRoute.path
    }
  })
}
// 添加响应拦截器
request.interceptors.response.use(function (response) {
  return response.data
}, async function (error) {
  // return Promise.reject(error)
  // console.dir(error)
  if (error.response.status === 401) {
    const tokenObj = store.state.user.token
    if (!tokenObj.refresh_token) {
      goLogin()
    }
    try {
      const res = await axios({
        method: 'put',
        url: baseURL + '/v1_0/authorizations',
        headers: {
          Authorization: 'Bearer ' + tokenObj.refresh_token
        }
      })
      // console.log(res)
      store.commit('user/setToken', {
        token: res.data.data.token,
        refresh_token: tokenObj.refresh_token
      })
      return request({
        method: error.config.method,
        url: error.config.url
      })
    } catch {
      goLogin()
    }
  } else {
    return Promise.reject(error)
  }
})
// 导出实例
export default request
